package me.boot.auth.jap.service;

import cn.hutool.core.bean.BeanUtil;
import com.fujieid.jap.core.JapUser;
import com.fujieid.jap.oauth2.token.AccessToken;
import com.xkcoding.json.JsonUtil;
import me.boot.auth.jap.config.AuthProperties;
import me.zhyd.oauth.model.AuthUser;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * 适用于 jap-oauth2 模块，实现 getByPlatformAndUid 和 createAndGetSocialUser 方法，
 * 如果需要sso登录，则必须实现 getById 方法
 */
@Service("oauth2")
public class JapOauth2UserServiceImpl extends BaseJapUserServiceImpl {

    /**
     * 创建并获取第三方用户，相当于第三方登录成功后，
     * 将授权关系保存到数据库（开发者业务系统中 oauth2 user -> sys user 的绑定关系）
     */
    @Override
    public JapUser createAndGetOauth2User(String platform, Map<String, Object> userInfo, Object tokenInfo) {
        // FIXME 业务端可以对 tokenInfo 进行保存或其他操作
        AccessToken accessToken = (AccessToken) tokenInfo;
        System.out.println(JsonUtil.toJsonString(accessToken));

        AuthProperties.Platform plat = authProperties.getPlatforms().get(platform);
        String uid = (String) userInfo.get(plat.getUidField());
        // 查询绑定关系，确定当前用户是否已经登录过业务系统
        JapUser japUser = this.getByPlatformAndUid(platform, uid);
        if (null == japUser) {
            AuthUser authUser = from(userInfo);
            japUser = userService.createUser(authUser);
        }
        return japUser;
    }

    private AuthUser from(Map<String, Object> userInfo) {
        AuthUser user = new AuthUser();
        BeanUtil.copyProperties(userInfo, user, true);
        // FIXME 需根据不同平台转换或提前建立字段对照表
        return user;
    }
}
